/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2017 by Hitachi Vantara : http://www.pentaho.com
 *
 *******************************************************************************
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 ******************************************************************************/

package org.pentaho.di.core.database;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class SqlCommentScrubberIT {

  String[][] testAndResultString =
  {

    // SQL with no comments
    { "SELECT * FROM MYTABLE", "SELECT * FROM MYTABLE" },

    // SQL with a one-line comment
    { "SELECT * FROM\n-- Test 1\n MYTABLE;", "SELECT * FROM\n MYTABLE;" },

    // SQL with multi-line comment at the top
    { "/* This \n is \n a multiline \n comment \n*/\nSELECT 1 FROM DUAL", "\nSELECT 1 FROM DUAL" },

    // SQL with multi-line comment in the middle
    { "SELECT 1 FROM\n/* This \n is \n a multiline \n comment \n*/\nDUAL", "SELECT 1 FROM\n\nDUAL" },

    // SQL with double-dashes inside a string
    {
      "UPDATE table1 SET col1 = '----' WHERE col1 IS NULL;\nUPDATE table1 SET col2 = '-----' "
        + "WHERE col2 IS NULL;\nUPDATE table1 SET col3 = '-----' WHERE col3 IS NULL;",
      "UPDATE table1 SET col1 = '----' WHERE col1 IS NULL;\nUPDATE table1 SET col2 = '-----' "
        + "WHERE col2 IS NULL;\nUPDATE table1 SET col3 = '-----' WHERE col3 IS NULL;" },

    // SQL with multi-line comment inside a string
    { "TEST '/* comment in string */'", "TEST '/* comment in string */'" },

    // SQL with double-dashes inside a string
    { "SELECT 'value-1' AS v1, 'value--1' AS v2;", "SELECT 'value-1' AS v1, 'value--1' AS v2;" },

    // SQL with double-dashes inside a double-quoted string
    { "SELECT \"value-1\" AS v1, \"value--1\" AS v2;", "SELECT \"value-1\" AS v1, \"value--1\" AS v2;" },

    // SQL with a single quote inside a double-quoted string
    {
      "select transname \"Doesn't w--'ork\" from logs.log_trans limit 0,20000;",
      "select transname \"Doesn't w--'ork\" from logs.log_trans limit 0,20000;" },

    // SQL with a double quote and comment inside a single-quoted string
    {
      "select transname '\"hello--world\"' from --logs.log_trans",
      "select transname '\"hello--world\"' from " },

    // Multi-line comment with SQL keywords
    {
      "/* my comment which may have sql keywords in it such as function, procedure etc. "
        + "Seems to cause issues within\ncomments.\n*/\n\n"
        + "if exists ( some query)\ndrop view myView;\n\ncreate view myView as\nselect query here ",
      "\n\nif exists ( some query)\ndrop view myView;\n\ncreate view myView as\nselect query here " },

    // Multi-line comment with quotes inside
    { "/*\n' my comment\n' more comment\n' a third line of the comment.\n*/", "" },

    // Null input
    { null, null },

    // Empty input
    { "", "" }, };

  @Test
  public void testRemoveComments() {
    for ( String[] testSet : testAndResultString ) {
      assertEquals( SqlCommentScrubber.removeComments( testSet[0] ), testSet[1] );
    }
  }
}
